package com.example.demo.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.HeSuan;
import com.example.demo.entity.NocvData;
import com.example.demo.service.IndexService;
import com.example.demo.vo.DataView;
import com.example.demo.vo.NocvDataVo;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Coding路人王
 * @date 2022/5/25 11:09
 */
@RestController
public class ChinaDataAdminController {

    @Autowired
    private IndexService indexService;

    /**
     * 模糊查询 带有分页
     * @return
     */
    @GetMapping(value = "/listDataByPage")
    public DataView listDataByPage(NocvDataVo nocvDataVo){
        // 1. 创建分页的对象 当前页 每页限制大小
        IPage<NocvData> page = new Page<>(nocvDataVo.getPage(),nocvDataVo.getLimit());
        // 2. 创建模糊查询条件
        QueryWrapper<NocvData> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(!(nocvDataVo.getName() == null),"name",nocvDataVo.getName());
        // 3. 最多的排在最上面
        queryWrapper.orderByDesc("value");
        // 4. 查询数据库
        indexService.page(page,queryWrapper);
        // 5. 返回数据封装
        DataView dataView = new DataView(page.getTotal(),page.getRecords());
        return dataView;
    }


//    /**
//     * 删除数据根据ID
//     * @param id
//     * @return
//     */
//    @PostMapping("/china/deleteById")
//    public DataView deleteById(Integer id){
//        indexService.removeById(id);
//        DataView dataView = new DataView();
//        dataView.setCode(200);
//        dataView.setMsg("删除据成功！");
//        return dataView;
//    }

//    /**
//     * 新增或者修改【ID】
//     * id: nocvData 有值修改，没有值就是新增
//     * update nocv_data set name = "" where id = ?
//     * insert into
//     * @param nocvData
//     * @return
//     */
//    @PostMapping("/china/addOrUpdateChina")
//    //@PutMapping
//    public DataView addOrUpdateChina(NocvData nocvData){
//        boolean save = indexService.saveOrUpdate(nocvData);
//        DataView dataView = new DataView();
//        if (save){
//            dataView.setCode(200);
//            dataView.setMsg("新增或者修改数据成功！");
//            return dataView;
//        }
//        dataView.setCode(100);
//        dataView.setMsg("新增或者修改数据失败！");
//        return dataView;
//    }


    @RequestMapping("/addChinaNocvDate")
    @ResponseBody
    public DataView addChinaNocvDate(NocvData nocvData){
        nocvData.setUpdateTime(new Date());
        indexService.save(nocvData);
        DataView dataView = new DataView();
        dataView.setCode(200);
        dataView.setMsg("添加疫情数据成功！");
        return dataView;
    }

    @RequestMapping("/updateChinaNocvDate")
    @ResponseBody
    public DataView updateChinaNocvDate(NocvData nocvData){
        indexService.updateById(nocvData);
        DataView dataView = new DataView();
        dataView.setCode(200);
        dataView.setMsg("修改疫情数据成功！");
        return dataView;
    }

    @RequestMapping("/deleteChinaNocvDate")
    @ResponseBody
    public DataView deleteHeSuan(Integer id){
        indexService.removeById(id);
        DataView dataView = new DataView();
        dataView.setCode(200);
        dataView.setMsg("删除疫情信息成功！");
        return dataView;
    }








    /***
     * Excel的拖拽或者点击上传
     * 1.前台页面发送一个请求，上传文件MutilpartFile HTTP
     * 2.Controller,上传文件MutilpartFile 参数
     * 3.POI 解析文件，里面的数据一行一行全部解析出来
     * 4.每一条数据插入数据库
     */
    @RequestMapping("/excelImportChina")
    public DataView excelImportChina(@RequestParam("file") MultipartFile file) throws Exception{
        DataView dataView = new DataView();

        // 1. 文件不能为空
        if (file.isEmpty()){
            dataView.setMsg("文件为空，不能上传！");
        }

        // 2. POI获取Excel解析数据
        HSSFWorkbook wb = new HSSFWorkbook(file.getInputStream());
        HSSFSheet sheet = wb.getSheetAt(0);

        // 3. 定义一个程序集合 接受 文件中的数据
        List<NocvData> list = new ArrayList<>();
        HSSFRow row = null;

        // 4. 解析数据，装到集合里面
        for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
            // 4.1 定义实体
            NocvData nocvData = new NocvData();
            // 4.2 每一行的数据 放到实体类里面
            row = sheet.getRow(i);
            // 4.3 解析数据
            nocvData.setName(row.getCell(0).getStringCellValue());
            nocvData.setValue((int) row.getCell(1).getNumericCellValue());
            // 5.添加list集合
            list.add(nocvData);
        }

        // 6. 插入数据库
        indexService.saveBatch(list);
        dataView.setCode(200);
        dataView.setMsg("excel插入成功！");
        return dataView;
    }


    /**
     * 导出Excel数据 中国疫情数据
     * 1.查询数据库
     * 2.建立Excel对象，封装数据
     * 3.建立输出流，输出文件
     */
    @RequestMapping("/excelOutPortChina")
    public void excelOutPortChina(HttpServletResponse response) throws Exception {
        // 1.查询数据库【查询所有，复核人条件的数据给你查询来】
        List<NocvData> list = indexService.list();

        // 2.建立Excel对象，封装数据
        response.setCharacterEncoding("UTF-8");
        // 2.1 创建Excel对象
        HSSFWorkbook wb = new HSSFWorkbook();
        // 2.2 创建sheet对象
        HSSFSheet sheet = wb.createSheet("数据sheet1");
        // 2.3 创建表头
        HSSFRow hssfRow = sheet.createRow(0);
        hssfRow.createCell(0).setCellValue("城市名称");
        hssfRow.createCell(1).setCellValue("确诊数量");
        // 3.遍历数据，封装Excel公作对象
        for (NocvData data : list){
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);
            dataRow.createCell(0).setCellValue(data.getName());
            dataRow.createCell(1).setCellValue(data.getValue());
        }
        // 4.建立输出流，输出浏览器文件
        OutputStream os = null;
        // 4.1 设置一下excel名字,输出类型编码
        response.setContentType("application/octet-stream;chartset=utf8");
        response.setHeader("Content-Disposition","attachment;filename="+ new String("疫情数据表".getBytes(),"iso-8859-1")+".xls");
        // 4.2 输出文件
        os = response.getOutputStream();
        wb.write(os);
        os.flush();
        // 5. 关闭输出流
        os.close();
    }


}
